home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_c
/
mscheap2
/
heap.h
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-12
|
8KB
|
353 lines
/*/
Copyright (c) 1990 by Optimal Software, All Rights Reserved
/*/
#if !defined( HEAP_H )
#define HEAP_H
#if defined( M_I86SM )
#define _HEAPLIB "sheap"
#define _DATA_NEAR
#define _CODE_NEAR
#elif defined( M_I86MM )
#define _HEAPLIB "mheap"
#define _DATA_NEAR
#define _CODE_FAR
#elif defined( M_I86CM )
#define _HEAPLIB "cheap"
#define _DATA_FAR
#define _CODE_NEAR
#elif defined( M_I86LM ) || defined( M_I86HM )
#define _HEAPLIB "lheap"
#define _DATA_FAR
#define _CODE_FAR
#else
#error Undefined address model
#endif
/*/
Tell linker to look for heap.lib
N.b., this does not work, but MS might fix it some day.
/*/
#if defined( MSC )
#pragma comment ( lib, _HEAPLIB )
#endif
#if defined( _DATA_NEAR )
#define _PREFIX( symbol ) _n##symbol
#elif defined( _DATA_FAR )
#define _PREFIX( symbol ) _f##symbol
#endif
/*/
The following pre-processor symbols control the objective of the
heap manager. The current setting is recorded in the _heapmode
variable. Programs may change this value on the fly, but it is
usually best to set the desired mode at the beginning of the program
and leave it at that.
Default: TIME (because this approximates MSC usage)
/*/
#if !defined( STDMSC )
#define _HEAPTIME 0
#define _HEAPSIZE 1
#define _HEAPSPACE 2
#if !defined(_HEAPMODE)
#define _HEAPMODE _HEAPTIME
#endif
#endif
/*/
Result code for _heapchk()
c.f. MSC _heapchk(), _heapset(), _heapwalk()
/*/
#if !defined(_HEAPEMPTY)
#define _HEAPEMPTY -1
#define _HEAPOK -2
#define _HEAPBADBEGIN -3
#define _HEAPBADNODE -4 /* invalid control block */
#define _HEAPEND -5
#define _HEAPBADPTR -6 /* bad _heapwalk ptr or data corrupted */
#define _FREEENTRY 0
#define _USEDENTRY 1
#endif
#define SIZE_MAX 0xFFFF
/********** type definitions **********/
typedef unsigned int uint;
#if !defined(_SIZE_T_DEFINED)
typedef uint size_t;
#define _SIZE_T_DEFINED
#endif
typedef struct /* linkage in a doubly-linked list */
{
uint last; /* segment pointer to preceeding list entry */
uint next; /* segment pointer to following list entry */
} _LINK;
typedef struct /* every arena obtained from DOS has one of these */
{
_LINK link; /* links to other arenas */
uint size; /* size of this arena including header and trailer */
uint isdos; /* memory from DOS? [freeable by _heappack()] */
} _ARENA;
typedef struct /* every allocated block has a header of this form */
{
_LINK clist; /* links to other chunks in same arena */
_LINK flist; /* links to free/join list -- 0 for an in-use entry */
/* ... used by debugger to record info on used entries */
} _CHUNK;
#if !defined(_HEAPINFO_DEFINED) /* c.f. MSC malloc.h */
typedef struct _heapinfo
{
int far *_pentry;
size_t _size;
int _useflag;
} _HEAPINFO;
#define _HEAPINFO_DEFINED
#endif
/********** global variables; init in heaputil.c **********/
extern size_t cdecl _amblksiz; /* DOS allocation quantum */
#if !defined( STDMSC )
extern int cdecl _heapmode; /* mode of operation; see TIME/SIZE/SPACE above */
extern size_t cdecl _heappad ; /* padding at ends of every allocation */
#endif
/********** Function prototypes and aliases **********/
extern void *cdecl alloca( size_t nbytes );
extern void *cdecl calloc( size_t nitems, size_t nbytes );
extern void *cdecl _expand( void *ptr, size_t nbytes );
#if !defined( STDMSC )
extern void far *cdecl _fcalloc( size_t nitems, size_t nbytes );
#endif
#if !defined( STDMSC )
extern void far *cdecl _fexpand( void far *ptr, size_t nbytes );
#endif
extern void cdecl _ffree( void far *ptr );
extern int cdecl _fheapchk( void );
#if !defined( STDMSC ) && defined( FILE )
extern void cdecl _fheapdump( FILE *output, int verbose );
#endif
#if !defined( STDMSC )
extern int cdecl _fheappack( void );
#endif
extern int cdecl _fheapset( uint fill );
extern int cdecl _fheapwalk( struct _heapinfo *hp );
#if !defined( STDMSC )
extern int _fheapwatch( void far *ptr, int enable );
#endif
extern void far *cdecl _fmalloc( size_t nbytes );
extern size_t cdecl _fmsize( void far *ptr );
#if !defined( STDMSC )
extern void far *cdecl _frealloc( void far *ptr, size_t nbytes );
#endif
extern void cdecl free( void *ptr );
extern uint cdecl _freect( size_t nbytes );
#if !defined( STDMSC )
extern void far *cdecl _frelocate( void far *ptr );
#endif
#if defined( STDMSC )
extern void huge *cdecl halloc( long nitems, size_t nbytes );
#endif
#if !defined( STDMSC )
extern void huge *cdecl _hcalloc( long nitems, size_t nbytes );
#endif
extern int cdecl _heapchk( void );
#if !defined( STDMSC ) && defined( FILE )
extern void cdecl _heapdump( FILE *output, int verbose );
#endif
#if !defined( STDMSC )
extern int cdecl _heappack( void );
#endif
extern int cdecl _heapset( uint fill );
#if !defined( STDMSC )
extern char *cdecl _heapstat( int status );
#endif
extern int cdecl _heapwalk( struct _heapinfo *hp );
#if !defined( STDMSC )
extern int cdecl _heapwatch( void *ptr, int enable );
#endif
#if !defined( STDMSC )
extern void huge *cdecl _hexpand( void huge *ptr, long nbytes );
#endif
#if defined( STDMSC )
extern void cdecl hfree( void huge *ptr );
#endif
#if !defined( STDMSC )
extern void cdecl _hfree( void huge *ptr );
#endif
extern int cdecl _hheapchk( void );
#if !defined( STDMSC ) && defined( FILE )
extern void cdecl _hheapdump( FILE *output, int verbose );
#endif
#if !defined( STDMSC )
extern int cdecl _hheappack( void );
#endif
#if !defined( STDMSC )
extern int cdecl _hheapset( uint fill );
#endif
#if !defined( STDMSC )
extern int cdecl _hheapwalk( struct _heapinfo *hp );
#endif
#if !defined( STDMSC )
extern int cdecl _hheapwatch( void huge *ptr, int enable );
#endif
#if !defined( STDMSC )
extern void huge *cdecl _hmalloc( long nbytes );
#endif
#if !defined( STDMSC )
extern long cdecl _hmsize( void huge *ptr );
#endif
#if !defined( STDMSC )
extern void huge *cdecl _hrealloc( void huge *ptr, long nbytes );
#endif
#if !defined( STDMSC )
extern void huge *cdecl _hrelocate( void huge *ptr );
#endif
extern void *cdecl malloc( size_t nbytes );
extern size_t cdecl _memavl( void );
extern size_t cdecl _memmax( void );
extern size_t cdecl _msize( void *ptr );
#if !defined( STDMSC )
extern void near *cdecl _ncalloc( size_t nitems, size_t nbytes );
#endif
#if !defined( STDMSC )
extern void near *cdecl _nexpand( void near *ptr, size_t nbytes );
#endif
extern void cdecl _nfree( void near *ptr );
extern int cdecl _nheapchk( void );
#if !defined( STDMSC ) && defined( FILE )
extern void cdecl _nheapdump( FILE *output, int verbose );
#endif
#if !defined( STDMSC )
extern int cdecl _nheappack( void );
#endif
extern int cdecl _nheapset( uint fill );
extern int cdecl _nheapwalk( struct _heapinfo *hp );
#if !defined( STDMSC )
extern int cdecl _nheapwatch( void near *ptr, int enable );
#endif
extern void near *cdecl _nmalloc( size_t nbytes );
extern size_t cdecl _nmsize( void near *ptr );
#if !defined( STDMSC )
extern void near *cdecl _nrealloc( void near *ptr, size_t nbytes );
#endif
#if !defined( STDMSC )
extern void near *cdecl _nrelocate( void near *ptr );
#endif
extern void *cdecl realloc( void *ptr, size_t nbytes );
#if !defined( STDMSC )
extern void *cdecl _relocate( void *ptr );
#endif
extern void *cdecl sbrk( int );
extern size_t cdecl stackavail( void );
/*/
Include debug functions if necessary
/*/
#if !defined( STDMSC) && ( defined( _HEAPDEBUG ) || defined( _HEAPTRACE ) )
#include <heapdbg.h>
#endif
#endif /* defined( HEAP_H ) */